23

» WarCraft 3 / Землетрясение

Похожие вопросы:

ответ
можно дамми-юнитами кастовать «громовую поступь» в случайные точки определённой области
ответ
Проблема в в том, что владелец нейтрально-враждебный!
ответ
BrEd Pitt:
Цунами, буран, образование водоворота, оползни (триггерно).
Можно реализовать что угодно на нормальной физической модели, у Melissa в большом паке наработок есть. С грамотным подходом можно реализовать любой катаклизм.

23

» WarCraft 3 / Как сделать выбор расы через Диалоговое окно

Принятый ответ
Похожие вопросы:

ответ
NekoriDes:
После того, как кнопка была нажата, создавай даммика и заставляй его оплетать рудник.
Нет нужды, близзард.ж помощь (для справки, там есть функция которая сразу же сменяет обычный рудник на проклятый, рядом с исходной позицией игрока )
Если вы делайте мили карту, то вам могут очень пригодится и другие функции из Blizzard.j, советую с ними ознакомится.
ответ
Пикай всех игроков в группу и показывай каждому игроку свое окно. Для этого переменные кнопок и окна делай как массивы

23

» WarCraft 3 / Проблема с моделью

Похожие вопросы:

ответ
Свершылось... Заработало...
Вот оно.

Описание проверки:
  • проверил в редакторе, он просто вылетает при попытке настройки в РО;
  • переконвертировал в .mdl и осмотрел, все норм;
  • открыл в War3ModelEditore, удалил лишние текстуры, материалы, настроил анимации геосетов;
  • профит.
Если кто не верит, вот скрин.
ответ
Slice_Of_Spice:
ssbbssc, понятия не имею, почему он так обозвал экзешник редактора. Может из-за ЖНГП. Если ты про версию варика, то она 1.26.
С другими моделями всё ок? Если да, то копай модель, нарушил правила какие-то. Пересобери её заного)
ответ
Darknessay, я не прикосаюсь к этим моделям. Я знат не знаю про вашу ''MDLVIS''. Моделей просто нет!!!
ответ
Всё норм, это что-то с картой было не так)
PT153:
Вдруг кто нибудь да посмотрит...
В чём проблема загрузить её сюда?
Всё норм, это что-то с картой было не так)

23

» WarCraft 3 / Морф

Похожие вопросы:

ответ
В триггере с инициализацией создаешь действие: Игрок - make Ю2 недоступно for training by игрок.
Создаешь триггер: юнит завершает исследование (твой аналог берсерка) - заблокировать Ю1 (как в пункте 1), а Ю2 - разблокировать.
Создаешь способность на основе Безумие (Sbsk), указываешь в графе "новый тип войск" Ю2, даешь эту способность Ю1.
ответ
Всё. Сам разобрался.
ответ
юниту, в которого происходит морф нужно добавить как на скрине
ответ
но лучше наверн посмотреть доту

23

» WarCraft 3 / Очень странно.

Похожие вопросы:

ответ
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
ответ
В том что нанося урон - ты вызываешь новый поток, новый поток триггера который срабатывает на получения урона, и в этом триггере используются те же переменные что и тут, вот и все. Глобалки нужно использовать с умом.
ответ
>> степень опасности
привет, каждый пользователь икапа дал админ-доступ неизвестной проге под названием лаунчер, с неизвестным содержимым. Содержимое карты тебя должно волновать примерно никак после этого.
ответ
Такое бывает, когда в JNGP создаёш объект с равкодом сущетвующей способности.

23

» WarCraft 3 / Новый тип переменной

Похожие вопросы:

ответ
Ну так то темповые глобалки и структуры vjass'а юзают уже хрен знает сколько лет, ибо да это побыстрее, тут даже вопрос не в памяти а в том что создание переменной это отельная операция как и обнуления, что ненужно делать с глобалками (их порой даже создавать ненужно, ибо bj глобалки сделали близзард) но нужно действовать осторожно, думать головой, не вызывая иных событий где будут юзатся эти же переменные.
ответ
Name Legion:
все..решил вопрос...оказывается что если установить иконку в мултиборде нужен Владелец!!
создали мултиборд
присвоили что нужно
поменяли значения
установили значения при выходе игрока из игры
и при выборе нового героя установили иконку в мултиборде согласно индексу игрока который вышел
спасибо за советы...вопрос закрыт
ответ
Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
ответ
всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут

23

» WarCraft 3 / Если unit == null

Похожие вопросы:

ответ
Главный кошмар тут, конечно - 14 групп. Пришлось так делать, т. к. принципиально не хочу применять глобалки, а локалки, похоже, после дестройгруп заново не юзабельны.
Это вроде должно быть легко поправить, вместо
call DestroyGroup (firewayunits1)
везде ставь
call GroupClear(firewayunits1)
и в самом конце уже, где идет обнуление переменных, там оставляешь DestroyGroup.
И с чего такая нелюбовь к глобалкам? Хештаблица используется, а это ж тоже глобалка, причем даже не просто глобалка, а супер-глобалка. У меня с ней постоянно головная боль была, из-за возникающих после интенсивной работы странных глюков...
ответ
Сначала проходит событие, срабатывает триггер, и выполняется код. И только после этого наносится урон. Чтобы обойти это, можно добавить паузу или таймером.
ответ
А что тут vJass требует? Глобалки?
Блок глобалок, что я объявил, и многострочные комментарии /*...*/.
PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
раскрыть
globals
    constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
    constant string AttEffect_A000 = "origin"
endglobals

function spell1_dmg takes nothing returns nothing
    local integer h = GetHandleId(GetExpiredTimer())
    local unit target = LoadInteger(udg_spells_hashtable, h, 0)
    local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
    // Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
    // Локалку всё также можно определить, но после endif её нужно обнулить.
    // set caster = null
    call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
    if tik_count > 0 then
        call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
                                              */ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
        call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count))  // асинхронно, работает по сети.
        call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
        call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
    else
        call FlushChildHashtable(udg_spells_hashtable, h)  // удаляет все записи с parent ключом h.
        call DestroyTimer(GetExpiredTimer())  // удаляет таймер.
    endif
    set target = null
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    call TimerStart(t, 0.05, true, function spell1_dmg)
    call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
    call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
    call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
    call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    set t = null  // обнуление.
endfunction
ответ
Steal nerves:
зацикленность.
У тебя триггер ловит нанесение урона, затем этому же юниту наносим триггерно урон. Триггер сам себя и зацикливает. Так он будет бесконечно ловить и наносить урон. Это надо либо прервать или заранее исключить такое.
Заранее исключаем:
Выключаем тек триггер <= чтобы не словил нанесения урона
триггерно наносим урона
включаем обратно тек триггер

23

» WarCraft 3 / За что отвечают данные функции?

Похожие вопросы:

ответ
закрыт по таймауту
ответ
Нужно ли удалять texttag после вышеуказанной функции CreateTexttag(...)
Нет, Lifespan с этим справится сам.
Какие данные нужно ввести в эту функцию, чтобы texttag двигался и исчезал так же, как и у BLIZZARD это работает с наградой за убийство, критическим ударами и предметами "Вязанка дров" и "Счастливая монетка"?
осторожно, инглиш
Gold Text
Floating Text - Create floating text that reads (+ + Gold) at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (100.00%, 86.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 54.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 2.00
Floating Text - Change the fadepoint of (Last created floating text) to 1.00
Lumber Text
Floating Text - Create floating text that reads (+ + Lumber) at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (0.00%, 78.00%, 31.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 54.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 2.00
Floating Text - Change the fadepoint of (Last created floating text) to 1.00
Bounty Text
Floating Text - Create floating text that reads (+ + Bounty) at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (100.00%, 86.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 54.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 3.00
Floating Text - Change the fadepoint of (Last created floating text) to 2.00
"miss" Text
Floating Text - Create floating text that reads miss at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (100.00%, 0.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 72.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 3.00
Floating Text - Change the fadepoint of (Last created floating text) to 1.00
Critical Strike
Floating Text - Create floating text that reads (CriticalStrike + !) at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (100.00%, 0.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 72.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 5.00
Floating Text - Change the fadepoint of (Last created floating text) to 2.00
Shadow Strike Text
Floating Text - Create floating text that reads ShadowStrike at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (62.00%, 100.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 72.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 5.00
Floating Text - Change the fadepoint of (Last created floating text) to 2.00
Mana Burn Text
Floating Text - Create floating text that reads ManaBurn at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (32.00%, 32.00%, 100.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 72.00 towards 90.00 degrees
Floating Text - Change permanent state of (Last created floating text) to Disable
Floating Text - Change the lifespan of (Last created floating text) to 5.00
Floating Text - Change the fadepoint of (Last created floating text) to 2.00

23

» WarCraft 3 / Проблема с мультибоардом

Похожие вопросы:

ответ
При использовании нативного функционала работы с мультибордом утекает multiboarditem при каждом действии. Советую попользоваться этим набором:
lib MBItems
{
    private multiboarditem  mbitem

    void MBSS(multiboard board, int col, int row, bool showValue, bool showIcon)
    {
        mbitem = MultiboardGetItem(board, row, col)
        MultiboardSetItemStyle(mbitem, showValue, showIcon)
        MultiboardReleaseItem(mbitem)
    }

    void MBSC(multiboard board, int col, int row, real red, real green, real blue, real transparency)
    {
        mbitem = MultiboardGetItem(board, row, col)
        MultiboardSetItemValueColor(mbitem, PercentToInt(red,255), PercentToInt(green,255), PercentToInt(blue,255), PercentToInt(100.0-transparency,255))
        MultiboardReleaseItem(mbitem)
    }

    void MBSW(multiboard board, int col, int row, real width)
    {
        mbitem = MultiboardGetItem(board, row, col)
        MultiboardSetItemWidth(mbitem, width/100.0)
        MultiboardReleaseItem(mbitem)
    }

    void MBSI(multiboard board, int col, int row, string iconFileName)
    {
        mbitem = MultiboardGetItem(board, row, col)
        MultiboardSetItemIcon(mbitem, iconFileName)
        MultiboardReleaseItem(mbitem)
    }

    void MBST(multiboard board, int col, int row, string val)
    {
        mbitem = MultiboardGetItem(board, row, col)
        MultiboardSetItemValue(mbitem, val)
        MultiboardReleaseItem(mbitem)
    }
}

23

» WarCraft 3 / Проигрывание анимации

Похожие вопросы:

ответ
Я так и не понял чем была вызвана эта проблема, но точно не из-за бокса. Скорее из-за камеры. Поставил вейт перед проигрыванием анимации и всё решилось.
ответ
Если в редакторе моделей видно, что разные комплекты анимацый имеют характерные названия, например, все с луком заканчиваются словом bow , тогда команда Animation - add animation tag " bow " to unit.
Вот пример: пример
ответ
Скорее поставить задержку в 0.00 сек при применении и потом уже удалять
ответ
vincent_freeman:
Ну я пробовал Play Unit's animation и Queue unit's animation вместе и по отдельности. Юниты проигрывают ее 1 раз и застывают.
Вот периодически заставляй, раз в сек пример ну или канал.
ответ
закрыт по таймауту

23

» WarCraft 3 / Пассивка вивера

Похожие вопросы:

ответ
Пассивка шишера это сфера молний, с эффектом способности "огненные стрелы". Перезарядка у самих стрел.
ответ
Мб это негейшин (амулет защиты) из него мона делать пассивку с кулдауном, для активации кастануть даммиком какойнить скилл в юнита с негейшином, будет кд.
Потом как кд пройдет негейшин удалить и добавить пассивку, ну и так далее.
ответ
Ну решается всё довольно тривиально
Юнит атакован
приказ атакующего юнита не равен "атаковать"
б.е. - приказать атакующий ПКМ атакованного
При первой атаке произойдёт небольшая потеря времени, т.к. получив при каз юнит заново начнёт анимацию атаки. Зато орб будет прокать.
Алсо если приказать юниту перейти нападая на противников (триггерно или ручками) - приказ юнита будет какой-надо и орб будет срабатывать.
ответ
Это лечится не юзаньем сферы замедления для подобных пассивок.
Лич долго кочевряжился с этой бедой, сфера замдления перебивает тучу орбов + не стакается с критами\башами.
Делайте триггерный орб (хотя-бы только для тех у кого есть активные автокаст орбы)

23

» WarCraft 3 / Игра странно себя ведет

Похожие вопросы:

ответ
достаёшь ai скрипты с версий 1.26 и 1.24 и сравниваешь их
ответ
На сколько я знаю, Микс в отличии от локальных файлов не требует правок в реестре.
ответ
Arak1da, да ты и вправду дурак.
Линейная интерполяция не делает вещи плавнее. Это равномерная интерполяция, линейная, так не движутся "живые" персонажи. За "плавностью" к Безье или Эрмиту. xgm.guru/p/wc3/anims-a-ya-3
А по поводу темы топика - могу обратить внимание автора на:
  1. Менял ли ты структуру исходного скелета, делая новую анимацию (имею ввиду только исходные кости, например, кость головы.)? Если да, то как?
  2. Попробуй посмотреть, что у тебя с интерполяцией для вращения по нужной оси на рутовом объекте.

23

» WarCraft 3 / Передача локальной переменной

Принятый ответ
Похожие вопросы:

ответ
Хэш таблица. Удобна и практична. Кстати, не забудь создать глобальную переменную Hash, типа хэш-таблица и при инициализации карты инициализировать Hash, иначе не будет работать.
function Trig_HealImp_Timer takes nothing returns nothing 
     local timer t = GetExpiredTimer() 
     local integer hid = GetHandleId(t) 
     local unit caster = LoadUnitHandle(udg_Hash, hid, 0) //Наш юнит хранится по ссылке "0", вытаскиваем его, чтобы с ним работать
     local integer i = LoadInteger(udg_Hash, hid, 1)  //Счетчик
    local real hp1 = GetUnitState(caster, ConvertUnitState(0)) //текущее здоровье
    local real hp = GetUnitState(caster, ConvertUnitState(1)) //максимальное здоровье
    local real chp = (hp/100)*0.8 //значение, на которое лечим юнит
     if i != 50 then //Срабатывание таймера 0,1. Так как длительность лечения составляет 5 сек, то таймер должен сработать 50 раз. Кстати, исходя из этого, высчитываем chp.
          set i = i + 1 //Увеличиваем значение счетчика
          call SetUnitState(caster, ConvertUnitState(0), hp1+chp) //лечим юнит
          call SaveInteger(udg_Hash, hid, 1, i) //Сохраняем новое значение счетчика. Если этого не будет, счетчик вечно будет равен 0.
     else //Когда счетчик равен 50, мы останавливаем таймер и чистим Хэш
         call PauseTimer(t) 
         call DestroyTimer(t) 
         call FlushChildHashtable(udg_Hash, hid) 
     endif 
     set t=null
     set caster = null 
endfunction 

function Trig_HealImp_Actions takes nothing returns nothing
    local timer t = CreateTimer()  //Таймер
     local integer hid = GetHandleId(t) )  //Id таймера
     local unit caster =GetTriggerUnit() //юнит, который мы будем лечить, по факту тот, кто активировал способность
     call SaveUnitHandle(udg_Hash, hid, 0, caster) //сохраняем в Хэш юнит caster с ссылкой "0".
     call SaveInteger(udg_Hash, hid, 1, 0) //сохраняем значение 0 с ссылкой "1". Это будет счетчик длительности лечения.
     call TimerStart(t, 0.1, true, function Trig_HealImp_Timer) //запускаем таймер. 
     set t = null  
     set caster = null 
endfunction
ответ
Конечно - глобальные переменные, хештаблицы, все функции Get в соответствующих потоках.
ответ
всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут

23

» WarCraft 3 / Телепортируется здание

Похожие вопросы:

ответ
делается это через проверку на существование точки сбора
то есть
boolean IsRally(unit u){
	location a=GetUnitRallyPoint(u);
	bool b=a!=null;
	RemoveLocation(a)
	return b;	
}
ответ
В редакторе скелета

23

» WarCraft 3 / Не появляется юнит

Похожие вопросы:

ответ
Раздели вейтом, конверсия требует нескольких моментов для доделки...
Долой "темный", юзай морф медведя или Иллидана
это не спасёт от потери приобретённых триггерно спеллов
ответ
Ты в условиях установил каждое здание в итоге выходит так что чтобы тригер сработал нужно завершить улучшение во всех этих зданиях сделай для каждого по отдельности либо через если/тогда/иначе.
ответ
SaveUnitHandle(hash,GetHandleId(target),7,caster);
GetHandleId(target) - хендл самого юнита
LoadUnitHandle(hash,GetUnitTypeId(u),7);
GetUnitTypeId(u) - Ид типа юнита, а не хендл.
ответ
call CreateUnit(GetOwningPlayer(caster),'e000',kursor_x,kursor_y,0.00)
set dummy = bj_lastCreatedUnit
нативная CreateUnit не записывает юнита в bj_lastCreatedUnit, это делают только БЖ функции (вон там префикс bj_)
поменяй на
set dummy = CreateUnit(GetOwningPlayer(caster),'e000',kursor_x,kursor_y,0.00)
ответ
8gabriel8:
Тип передвижения на Нет ставишь?
Хотя, если здание, значит прямоугольная карта путей по игровой сетке, а не любое местоположение. Тип передвижения в этом случае не важен.
Я думаю кроме нас тут уже больше никто не напишет поэтому я закрою вопрос, спасибо за внимание и ответы.

23

» WarCraft 3 / 2 книги заклинаний у одного воина

Похожие вопросы:

ответ
Хозяин Миров:
Tobi123, Нет, конечно не его, пустышка есть. Стоп, значит надо для всех один эффект и заклинание дать? Попробую.
Audes, Но не на два же слова! Но тогда как увеличить это место?
Tobi123, Попробовал, выносит, как только вхожу юнитом в зону действия ауры (Аура у здания).

23

» WarCraft 3 / Удаление лишнего

Похожие вопросы:

ответ
это не совсем то, но тоже решение проблемы
ответ
~8gabriel8:
Вот сегодня ночью расписывал:
Если кратко, нужен mdlvis 1.39, в нём выбираешь кадры анимации на шкале, щёлкнув мышью в начале участка с ненужными кадрами, а потом Shift+щелчок мышью в конце участка, [Del].

23

» WarCraft 3 / Способности предмета

Похожие вопросы:

ответ
Даже на GUI есть: Герой - UseItem. Там же можно использовать на юнита или точку.
Для того чтобы использовать нужный предмет придется перебирать все.
ответ
Так ты же выключаешь триггер на 18 секунд вот он и не срабатывает.
Поставь условие, что герыч не имеет абилки-пустышки, если не имеет - дать её и через 18 сек забрать и пустить молнию.
Правда я не уверен насчёт того, отловится ли attacking unit через 18 сек вейта, проверь...
Вообще, если устраивает орбом - то даёшь "сферу молний" с эффектом "цепь молний", у которой 18 сек перезарядка(у цепи не у сферы)
ответ
constant native GetSpellTargetItem takes nothing returns item
Подробнее смотри в Common.j или jass API.
ответ
Steal nerves:
Способности нужно дать юниту, и все. Если эффект временный, используем вэйт/wait (по-русски ждать) или таймеры, по истечении которого удаляем способность. Но вэйты не рекомендуются для использования.
xgm.guru/p/wc3/articles новичок, иди почитай
xgm.guru/p/wc3/needspells здесь не стол для заказов, хотя тема заброшена
xgm.guru/p/wc3/bpe где-то тут была похожее, только с баффами
можете конкретно написать, что вам нужно.
смотреть сюда
событие - юнит применяет способность
условие -применяемая способность == тип твоей способности
действие - добавить способность
ждать 15 сек.
действие - удалить способность
про локалки + таймер, хэш-таблицы
xgm.guru/p/wc3/jass_local_vars есть примерчик внизу, похожий на ваш
ответ
Alexey103, она висит в ресурсах, достаточно ввести в поиск "Мемхак", ну если уж вы такие лени вот ссылка

23

» WarCraft 3 / Объединение предметов

Принятый ответ
Похожие вопросы:

ответ
Steal nerves:
ответы
Как объединить зелья лечения в одно с зарядом, если герой имеет одно в инвентаре и поднимает второе?
обычно используют "событие - юнит получает предмет", И на предмет, который вы получаете, ссылается переменная, которая называется item being manipulated. А юнит, который получает итем - Triggering Unit. Вы можете с помощью этой переменной итема узнать тип, сравнить. Потом циклом пробегаете по слотам (от 1 до 6), тут вся суть в одной команде триггерной (item in slot X, итем в слоте Х) и проверяете есть ли такой же итем (не забываем делать проверки, на то что этот предмет не равен item being manipulated и сравниваете не одинаковые ли типы). Если есть такой же (находите тот же тип что и item being manipulated), то от item being manipulated берете заряды и прибавляете к зарядам существующего, а потом item being manipulated удаляете. Недостаток: при заполненном инвентаре такая штука не будет работать.Не хватает свободного места.
код
цикл А от 1 до 6
if тип итема (item being manipulated) РАВНО тип итема (item in slot А) and item being manipulated НЕ РАВНО item in slot А then проверяете
set k = Charges remaining in ( item being manipulated) + Charges remaining in ( item in slot А) складываете заряды
Set charges remaining in ( item in slot А) to ( k) устанавливаете кол-во зарядов
Remove Item (item being manipulated) удаляете
endif
Есть гуишная проверка на наличие итема определенного типа в инвентаре, но она утечна. И лучше циклом прогонять.
Кстати выше пример, там вот дропают итем, зачем? чтобы проверить есть ли такой же итем. А то мб проверка на наличие итема определенного типа в инвентаре найти подобранный итем. А нам нужно знать, что есть еще один, кроме подобранного. Поэтому дропают. Только не понятно зачем создаете новый итем.
Проверка, на то что подобранный предмет имеет зарядов больше 0, говорит нам о том что это не обычный предмет.
есть статьи
Как зелье с зарядом разделить, если игрок перекладывает зелье с зарядом в другую ячейку инвентаря, если возможно, то разделение происходить должно только при нажатии какой-то клавиши?
можно перекладывать в другой слот. для этого ловят приказ. Короче смотрите системы CCS
там создают новый такой же предмет, и выделяют кол-во зарядов, деля поровну например. Абилкой например, попробуй сделать целевую активную абилку с целью предмет, указывай на инвентарь и дели.
Как это можно сделать покороче для множества разных типов предметов?
всмысле покороче? сделать под одну группу? есть же классификация. Я вот делаю так, что все предметы, которые с зарядами, должны иметь классификацию "с зарядами". Не помню точно как называется класс итемов.
Как правильно реализовать в инвентаре 7 слот?
если у героя заполнен инвентарь, то он может подобрать руну. Вот в доте система скрещивания. То же самое можно сделать и с зарядами. На земле у него лежат руны, при подборе руна исчезает. Но мы проверяем слоты, есть ли такой итем. Если есть, прибавляем заряды к существующему. Иначе создать новый. При дропе итема, оригинал подменяет снова на руну. В руну можно передать значения зарядов.
А также ограничения какие-то на количество зарядов нужно ставить или сама система выше какой-то планки не даст собирать?
до такого не доходил.
скинул примеры (хотя многие дурацкие, но делал здесь хгм в качестве ответов)
вот еще одна система hh

23

» WarCraft 3 / Магазин в варкрафт

Похожие вопросы:

ответ
Проблема была в самих магазинах, сделал как в старой версии, заработало.
ответ
Steal nerves:
Тестил, тестил. Думал найду ошибку. Короче не знаю в чем дело, видимо и в правду баг. Решил по-другому. Ловить поставку, и ловить продажу. То есть ловить то, что пришло, и то, что ушло.
событием - "юнит закладывает в лавку" (EVENT_PLAYER_UNIT_PAWN_ITEM) ловим продажу итемов.
GetSellingUnit() =продающий торговец (типа всякие предметы закладывает в магазин и получает деньги)
GetBuyingUnit()=GetTriggerUnit() = покупающий торговец (это обычно магазин)

событием - "юнит закладывает из лавки (продает артефакт)" (EVENT_PLAYER_UNIT_SELL_ITEM) ловим покупку итемов
GetSellingUnit()=GetTriggerUnit()=продающий торговец (обычно это магазин)
GetBuyingUnit() = покупающий торговец (наш герой получает артефакты)
Решил, я по-своему. Короче, видимо, итем в магазине исчезает при добавлении. Попробовал запоминать все добавленные итемы, и при добавлении я сначала удалю всё в магазине, а потом заново добавлю. Пришлось, еще порядок (номер слотов) запоминать, а то строятся ключи хэша на строгом порядке. Если возьму и заберу итем посередине, придется заново выстраивать порядок.
Не знаю, пока тестил много времени, пока без косяков. Главное, что работает. Меня это радует. Но пока не буду спешить. Мне бы хотелось затестить норм.

23

» WarCraft 3 / Приоритет атаки ИИ

Принятый ответ
Похожие вопросы:

ответ
В редакторе объектов: Характеристики - Приоритет (число).
Юнитов с высоким приоритетом атакуют в первую очередь.
ответ
8gabriel8, приоритет менять нельзя
стандартный ии использует это поле для контроля юнитов
пишем свой ии в котором вместо приоритета юзаем свою переменную которой можем задавать любое значение
8gabriel8:
Но для меня это путь в Москву через Владивосток
ну если между тобой и Москвой находится Владивосток то иначе никак(а вар3 как раз расположен за Владивостоком)
ответ
Так ты дай юниту 2 атаки и глянь, какие он использует на какой дистанции.

23

» WarCraft 3 / Не открывает карту в warcraft 3

Похожие вопросы:

ответ
если не вдаваться в подробности,то ты просто не сможешь засейвить карту после протекта
ответ
Вам сюда, господин хороший. Там есть ответы, практически, на все ваши вопросы.
ответ
Stalker Freedom:
Чаще всего проблема заключается в том, что юные маперы забывают импортировать текстуры. Ты ведь всё правильно импортировал?
ответ
Steal nerves:
Короче понял как сделать (ну и в принципе ничего сложного. методом тыка узнал как это сделать. до этого уже 2 часа добил):
расписываю
  1. у меня есть почва
  1. обрабатываю. Но вообще-то не нужно вырезать, просто выделите и все. Но я уж поздно, обработал. По примеру уберсплатов для зданий в варике не вырезаны края. Просто альфа канал стоит
  1. Ну и .. (понял бы любой)
  1. сохраняете в формате tga, потом конвентируете (можно прогой Warcraft 3 Viewer). и смотрим, что получилось
получилось не очень, нужно наверное другую картинку подобрать.

23

» WarCraft 3 / PauseUnit

Похожие вопросы:

ответ
Я для этого сделал свою системку поддержания эффекта оглушения.
Создаётся на карте даммик, с молотом бурь, 1 уровень, без маны, ренж 99999, время оглушения - 0.00
В нужный момент отдаёт приказ застанить юнита, и записываем нужное нам время (например 2.50 сек)
когда время истекает - снимает бафф
Если пытаемся станить юнита у которого уже есть стан - ищем его время и обновляем на новое
Если новое меньше старого - ничего не делаем. Если новое больше старого - пишем новое.
ответ
Что там за ужасные условия?
Короче. Можешь сделать вот так вота:
Исходные данные- массив героев.
1 способ- создаешь массив, размер которого = размеру массива героев и заполняешь его линейным методом. То есть с помощью рандома выбираешь первое число. И потом с помощью последовательности i+(k*q), где i- изначальная ячейка; k- попытка: q- шаг.
2 способ- также создаешь массив, но заполняешь его вот так: рандомом выбираешь героя. Проверяешь, имеется ли уже такой в новом массиве. Если да- перевыбираешь, если нет- вставляешь и переходишь к следующей ячейки
Таким образом каждую игру будет генерироваться твой массив случайным образом. Заводишь переменную s, считающую сколько героев уже вытащили, и создаешь героя из твоего нового сформированного массива под номером s
Проще сказать: формируй каждую игру новый массив и вытаскивай по одному герою из него каждый раз, когда требуется
ответ
исправил некоторые недочёты, и всё же хотелось бы узнать, может еще есть какие-то недоработки тут?
раскрыть
library UnitRecycler requires UnitRevive



    globals

        private  constant  integer         MAX_STOCKED_RAWCODES         =  256
        private  constant  integer         MAX_STOCKED_UNITTYPES        =  1024

        private  constant  group           stock                        =  CreateGroup( )
        private            unit            recycledUnit                 =  null

        private            integer         stockedRawCodesCount         =  0
        private            integer  array  stockedRawCodes

        private            integer  array  stockedUnitCount
        private            unit     array  stockedUnit[ MAX_STOCKED_RAWCODES ] [ MAX_STOCKED_UNITTYPES ]

    endglobals



    private constant function IsUnitAlive takes unit whichUnit returns boolean
        return not ( IsUnitType( whichUnit, UNIT_TYPE_DEAD ) or  ( GetUnitTypeId( whichUnit ) == 0 ) )
    endfunction



    private function RAW2S takes integer value returns string
        local  string   charMap         =  ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."
        local  string   result          =  ""
        local  integer  remainingValue  =  value
        local  integer  byteno          =  0
        local  integer  charValue

        loop
            set charValue = ModuloInteger(remainingValue, 256)
            set remainingValue = remainingValue / 256
            set result = SubString(charMap, charValue, charValue + 1) + result
     
            set byteno = byteno + 1
            exitwhen ( byteno == 4 )
        endloop

        return result
    endfunction



    private function GetUnitFromStock takes integer rawCode returns unit
        local  integer  i  =  0

        loop

            if ( stockedRawCodes[ i ] == rawCode ) and ( stockedUnitCount [ i ] > 0 ) then

                set  stockedUnitCount [ i ]                             =  stockedUnitCount [ i ] - 1
                set  recycledUnit                                       =  stockedUnit [ i ] [ stockedUnitCount [ i ] ]
                set  stockedUnit      [ i ] [ stockedUnitCount [ i ] ]  =  null
                exitwhen true
            endif

            if ( i == stockedRawCodesCount ) then

                debug call BJDebugMsg( "GetUnitFromStock(...) :    '" + RAW2S( rawCode ) + "' unittype stock is emty. New unit has been created." )
                set recycledUnit = CreateUnit( Player( 15 ), rawCode, HIDDEN_X, HIDDEN_Y, 0.0 )
                exitwhen true
            endif

            set i = i + 1
        endloop

        return recycledUnit
    endfunction



    private function AddUnitToStock takes unit whichUnit returns nothing
        local  integer rawCode  =  GetUnitTypeId( whichUnit )
        local  integer i        =  0

        loop
            exitwhen ( stockedRawCodes[ i ] == rawCode )

            if ( i == stockedRawCodesCount ) and ( stockedRawCodesCount < MAX_STOCKED_RAWCODES ) then
                set stockedRawCodes[ i ] = rawCode
                set stockedRawCodesCount = stockedRawCodesCount + 1
                exitwhen true

            elseif ( stockedRawCodesCount == MAX_STOCKED_RAWCODES ) then
                debug call BJDebugMsg( "AddUnitToStock(...) :    Cannot add unit to stock, max rawcode count achieved. Unit has been removed." )
                call KillUnit( whichUnit )
                call ShowUnit( whichUnit, false )
            endif

            set i = i + 1
        endloop

        if ( stockedUnitCount [ i ] < MAX_STOCKED_UNITTYPES ) then
            set stockedUnit      [ i ] [ stockedUnitCount [ i ] ]  =  whichUnit
            set stockedUnitCount [ i ]                             =  stockedUnitCount [ i ] + 1

        else
            debug call BJDebugMsg( "AddUnitToStock(...) :    Cannot add unit to stock, max unittype count achieved. Unit has been removed." )
            call KillUnit( whichUnit )
            call ShowUnit( whichUnit, false )
        endif

    endfunction



    function GetRecycledUnit takes player owner, integer rawCode, real x, real y, real facing returns unit
        if IsHeroUnitId( rawCode ) then
            debug call BJDebugMsg( "GetRecycledUnit(...) :    Attempt to  get recycled hero unit." )

        else
            set recycledUnit = GetUnitFromStock( rawCode )
            call GroupRemoveUnit    ( stock, recycledUnit )
            call PauseUnit          ( recycledUnit, false )
            call SetUnitOwner       ( recycledUnit, owner, true )
            call SetUnitPosition    ( recycledUnit, x, y )
            call SetUnitFacing      ( recycledUnit, facing )
            call SetUnitPathing     ( recycledUnit, true )
            call SetUnitInvulnerable( recycledUnit, false )
            call ShowUnit           ( recycledUnit, true )

            return recycledUnit
        endif

        return null
    endfunction



    function RecycleUnit takes unit whichUnit returns boolean
        if ( whichUnit == null ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle a null unit." )
            return false

        elseif IsUnitAlive( whichUnit ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle an alive unit." )
            return false

        elseif IsUnitInGroup( whichUnit, stock ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle an already recycled unit." )
            return false

        elseif IsHeroUnitId( GetUnitTypeId( whichUnit ) ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle a hero unit." )
            return false

        elseif ReviveUnit( whichUnit ) then
            call GroupAddUnit       ( stock, whichUnit )
            call PauseUnit          ( whichUnit, true )
            call SetUnitOwner       ( whichUnit, Player( 15 ), false )
            call SetUnitState       ( whichUnit, UNIT_STATE_LIFE, GetUnitState( whichUnit, UNIT_STATE_MAX_LIFE ) )
            call SetUnitState       ( whichUnit, UNIT_STATE_MANA, GetUnitState( whichUnit, UNIT_STATE_MAX_MANA ) )
            call SetUnitScale       ( whichUnit, 1.0, 0.0, 0.0 )
            call SetUnitVertexColor ( whichUnit, 255, 255, 255, 255 )
            call SetUnitFlyHeight   ( whichUnit, GetUnitDefaultFlyHeight( whichUnit ), 0.0 )
            call SetUnitPathing     ( whichUnit, false )
            call SetUnitInvulnerable( whichUnit, true )
//          call ShowUnit           ( whichUnit, false )
            call SetUnitPosition    ( whichUnit, HIDDEN_X, HIDDEN_Y )
            call AddUnitToStock     ( whichUnit )
            return true

        else
            debug call BJDebugMsg( "RecycleUnit(...) :    Cannot revive this unit." )
            return false
        endif

        return false
    endfunction



endlibrary
ответ
Если коротко: имена функций - жуть, не вижу определения PureDamageWithCrit, некоторые вызовы будут чуть медленнее из-за экономии места, ну и без хештаблицы можно, обойтись структурами + TimerExploit.
Блин, два раза кодировка сбивается в комменте, теперь вообще текста не видно, что за...
ответ
Razor_dex:
Мне кажется проблема в этом, он не просто передвигает, он перемещает с одной дистанции на другую, т.е рывками
Криво реализовано движение. У тебя смещение происходит сразу на 300 единиц, поэтому пролетаешь декорации, и потому, что функция SetUnitXY перемещает в точку беспрепятственно, игнорируя занимаемое юнитом пространство. Попробуй сделать так:
поменяй это
call SetUnitX(b,GetUnitX(b) + 300 * Cos(GetUnitFacing(a) * bj_DEGTORAD))
call SetUnitY(b,GetUnitY(b) + 300 * Sin(GetUnitFacing(a) * bj_DEGTORAD))
на это
call SetUnitPosition(b,GetUnitX(b) + 40 * Cos(GetUnitFacing(a) * bj_DEGTORAD),GetUnitY(b) + 40* Sin(GetUnitFacing(a) * bj_DEGTORAD))
ну и установи таймеру период срабатывания в 0.05 где-то.
call TimerStart(t,0.20,true,function Hakke_Act)
Вообще, по-хорошему, надо бы переделать весь спел.